package com.itqf.dynamic_proxy.factory;


import com.itqf.dynamic_proxy.MyAdvice;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Description:
 * @Company: 千锋互联
 * @Author: 李丽婷
 * @Date: 2021/1/14
 * @Time: 上午10:23
 */
public class MyProxyFactoryFinal {


    public   static Object createProxy(Object target) {

        //创建辅助类对象
        MyAdvice advice = new MyAdvice();
        //2.创建代理对象  Proxy
        /**
         *ClassLoader loader, 类加载器
         *Class<?>[] interfaces, 代理类实现的接口列表
         *InvocationHandler h 处理器
         */
       return  Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    /**
                     * @param proxy  代理对象
                     * @param method 代理的方法（目标方法）
                     * @param args   代理的方法的参数（目标方法）
                     * @return
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object r = null;
                        try {
                            advice.before();
                            //调用目标方法
                            /**
                             * Object obj,目标对象     被代理对象
                             * Object... args 目标对象 的参数列表
                             */
                            r = method.invoke(target, args);
                            advice.after();
                            System.out.println(r);
                        } catch (Exception e) {
                            //e.printStackTrace();
                            advice.throwable();
                        }

                        return r;
                    }
                });






    }



}
